package ar.com.age.distribuidora.presentacion.controller;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import ar.com.age.distribuidora.dominio.Cheque;
import ar.com.age.distribuidora.dominio.EstadoCheque;
import ar.com.age.distribuidora.dominio.MovimientoCheque;
import ar.com.age.distribuidora.presentacion.util.Mensajes;
import ar.com.age.distribuidora.presentacion.util.ServiceLocator;
import ar.com.age.distribuidora.presentacion.util.ValidadorTipoUsuario;

@ManagedBean
@ViewScoped
public class ChequeBean {

	private String nombreRegistrar;
	
	private String apellidoRegistrar;
	
	private String numeroRegistrar;
	
	private String serieRegistrar;
	
	private String bancoRegistrar;

	private String sucursalRegistrar;

	private String montoRegistrar;

	private String comentarioRegistrar;
	
	private String cuentaRegistrar;

	private Date fechaDepositoRegistrar;
	
	private EstadoCheque estadoChequeSeleccionadoRegistrar;
	
	private List<EstadoCheque> estadosCheques;
	
	private Cheque chequeSeleccionado;  
    
    private Cheque chequeSeleccionadoDetalles;
    
    private String 	montoEditar;

	private String nombreBuscar;
	
	private String apellidoBuscar;
	
	private String estadoBuscar;
	
	private String bancoBuscar;
	
	private String sucursalBuscar;
	
	private String cuentaBuscar;
	
	private Date fechaDesdeBuscar;
	
	private Date fechaHastaBuscar;
	
	private String montoBuscar;
	
	private List<Cheque> cheques;

	private boolean panelBuscarVisibilidad;
	
	private boolean panelEditarVisibilidad;

	private boolean panelRegistrarVisibilidad;
	
	private EstadoCheque estadoChequeAux;
	
	private String nombreEstadoCheque;
	
    
	public ChequeBean() {

		ValidadorTipoUsuario.validarEmpleado();
		
		this.estadosCheques = ServiceLocator.getChequeService().buscarTodosEstadoCheque();

		this.panelEditarVisibilidad = false;
		this.panelRegistrarVisibilidad = true;
		this.panelBuscarVisibilidad = false;
	}
	
	public boolean isPanelBuscarVisibilidad() {
		return panelBuscarVisibilidad;
	}

	public void setPanelBuscarVisibilidad(boolean panelBuscarVisibilidad) {
		this.panelBuscarVisibilidad = panelBuscarVisibilidad;
	}

	public EstadoCheque getEstadoChequeAux() {
		return estadoChequeAux;
	}

	public void setEstadoChequeAux(EstadoCheque estadoChequeAux) {
		this.estadoChequeAux = estadoChequeAux;
	}

	public String getNombreEstadoCheque() {
		return nombreEstadoCheque;
	}

	public void setNombreEstadoCheque(String nombreEstadoCheque) {
		this.nombreEstadoCheque = nombreEstadoCheque;
	}

	public boolean isPanelEditarVisibilidad() {
		return panelEditarVisibilidad;
	}

	public void setPanelEditarVisibilidad(boolean panelEditarVisibilidad) {
		this.panelEditarVisibilidad = panelEditarVisibilidad;
	}

	public boolean isPanelRegistrarVisibilidad() {
		return panelRegistrarVisibilidad;
	}

	public void setPanelRegistrarVisibilidad(boolean panelRegistrarVisibilidad) {
		this.panelRegistrarVisibilidad = panelRegistrarVisibilidad;
	}

	public String getNombreRegistrar() {
		return nombreRegistrar;
	}

	public void setNombreRegistrar(String nombreRegistrar) {
		this.nombreRegistrar = nombreRegistrar;
	}

	public String getApellidoRegistrar() {
		return apellidoRegistrar;
	}

	public void setApellidoRegistrar(String apellidoRegistrar) {
		this.apellidoRegistrar = apellidoRegistrar;
	}

	public String getNumeroRegistrar() {
		return numeroRegistrar;
	}

	public void setNumeroRegistrar(String numeroRegistrar) {
		this.numeroRegistrar = numeroRegistrar;
	}

	public String getSerieRegistrar() {
		return serieRegistrar;
	}

	public void setSerieRegistrar(String serieRegistrar) {
		this.serieRegistrar = serieRegistrar;
	}

	public String getBancoRegistrar() {
		return bancoRegistrar;
	}

	public void setBancoRegistrar(String bancoRegistrar) {
		this.bancoRegistrar = bancoRegistrar;
	}

	public String getSucursalRegistrar() {
		return sucursalRegistrar;
	}

	public void setSucursalRegistrar(String sucursalRegistrar) {
		this.sucursalRegistrar = sucursalRegistrar;
	}

	public String getMontoRegistrar() {
		return montoRegistrar;
	}

	public void setMontoRegistrar(String montoRegistrar) {
		this.montoRegistrar = montoRegistrar;
	}

	public String getComentarioRegistrar() {
		return comentarioRegistrar;
	}

	public void setComentarioRegistrar(String comentarioRegistrar) {
		this.comentarioRegistrar = comentarioRegistrar;
	}

	public String getCuentaRegistrar() {
		return cuentaRegistrar;
	}

	public void setCuentaRegistrar(String cuentaRegistrar) {
		this.cuentaRegistrar = cuentaRegistrar;
	}

	public Date getFechaDepositoRegistrar() {
		return fechaDepositoRegistrar;
	}

	public void setFechaDepositoRegistrar(Date fechaDepositoRegistrar) {
		this.fechaDepositoRegistrar = fechaDepositoRegistrar;
	}

	public EstadoCheque getEstadoChequeSeleccionadoRegistrar() {
		return estadoChequeSeleccionadoRegistrar;
	}

	public void setEstadoChequeSeleccionadoRegistrar(
			EstadoCheque estadoChequeSeleccionadoRegistrar) {
		this.estadoChequeSeleccionadoRegistrar = estadoChequeSeleccionadoRegistrar;
	}

	public List<EstadoCheque> getEstadosCheques() {
		return estadosCheques;
	}

	public void setEstadosCheques(List<EstadoCheque> estadosCheques) {
		this.estadosCheques = estadosCheques;
	}

	public Cheque getChequeSeleccionado() {
		return chequeSeleccionado;
	}

	public void setChequeSeleccionado(Cheque chequeSeleccionado) {
		this.chequeSeleccionado = chequeSeleccionado;
	}

	public Cheque getChequeSeleccionadoDetalles() {
		return chequeSeleccionadoDetalles;
	}

	public void setChequeSeleccionadoDetalles(Cheque chequeSeleccionadoDetalles) {
		this.chequeSeleccionadoDetalles = chequeSeleccionadoDetalles;
	}

	public String getMontoEditar() {
		return montoEditar;
	}

	public void setMontoEditar(String montoEditar) {
		this.montoEditar = montoEditar;
	}

	public String getNombreBuscar() {
		return nombreBuscar;
	}

	public void setNombreBuscar(String nombreBuscar) {
		this.nombreBuscar = nombreBuscar;
	}

	public String getApellidoBuscar() {
		return apellidoBuscar;
	}

	public void setApellidoBuscar(String apellidoBuscar) {
		this.apellidoBuscar = apellidoBuscar;
	}

	public String getEstadoBuscar() {
		return estadoBuscar;
	}

	public void setEstadoBuscar(String estadoBuscar) {
		this.estadoBuscar = estadoBuscar;
	}

	public String getBancoBuscar() {
		return bancoBuscar;
	}

	public void setBancoBuscar(String bancoBuscar) {
		this.bancoBuscar = bancoBuscar;
	}

	public String getSucursalBuscar() {
		return sucursalBuscar;
	}

	public void setSucursalBuscar(String sucursalBuscar) {
		this.sucursalBuscar = sucursalBuscar;
	}

	public String getCuentaBuscar() {
		return cuentaBuscar;
	}

	public void setCuentaBuscar(String cuentaBuscar) {
		this.cuentaBuscar = cuentaBuscar;
	}

	public Date getFechaDesdeBuscar() {
		return fechaDesdeBuscar;
	}

	public void setFechaDesdeBuscar(Date fechaDesdeBuscar) {
		this.fechaDesdeBuscar = fechaDesdeBuscar;
	}

	public Date getFechaHastaBuscar() {
		return fechaHastaBuscar;
	}

	public void setFechaHastaBuscar(Date fechaHastaBuscar) {
		this.fechaHastaBuscar = fechaHastaBuscar;
	}

	public String getMontoBuscar() {
		return montoBuscar;
	}

	public void setMontoBuscar(String montoBuscar) {
		this.montoBuscar = montoBuscar;
	}

	public List<Cheque> getCheques() {
		return cheques;
	}

	public void setCheques(List<Cheque> cheques) {
		this.cheques = cheques;
	}

	
	// Metodos del Bean

	public String registrarCheque() {
		
		Cheque cheque = new Cheque();
		cheque.setApellido(apellidoRegistrar);
		cheque.setEstadoCheque(estadoChequeSeleccionadoRegistrar);
		cheque.setNombre(nombreRegistrar);
		cheque.setBanco(bancoRegistrar);
		cheque.setComentario(comentarioRegistrar);
		cheque.setCuenta(cuentaRegistrar);
		cheque.setFechaDeposito(fechaDepositoRegistrar);
		cheque.setMonto(Double.parseDouble(montoRegistrar));
		cheque.setNumero(numeroRegistrar);
		cheque.setSerie(serieRegistrar);
		cheque.setSucursal(sucursalRegistrar);
		
		// Registro el Movimiento para la Auditoria de Cheques
		MovimientoCheque movimiento = new MovimientoCheque();
		movimiento.setCheque(cheque);
		Date fecha = Calendar.getInstance().getTime();
		movimiento.setFecha(fecha);
		movimiento.setTipo(Mensajes.REGISTRO_CHEQUE);
		
		ServiceLocator.getChequeService().crearOEditarCheque(cheque);
		ServiceLocator.getAuditoriaChequeService().crearOEditarMovimientoCheque(movimiento);
		
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "La operacion se ha realizado con exito.");  
		RequestContext.getCurrentInstance().showMessageInDialog(message);
		
		apellidoRegistrar = null;
		nombreRegistrar = null;
		estadoChequeSeleccionadoRegistrar = null;
		bancoRegistrar = null;
		comentarioRegistrar = null;
		cuentaRegistrar = null;
		fechaDepositoRegistrar = null;
		montoRegistrar = null;
		numeroRegistrar = null;
		serieRegistrar = null;
		sucursalRegistrar = null;
		
		return null;
	}
	
	
	public String actualizarCheque() {
		
		if (this.chequeSeleccionado != null) {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cheque",  "Cheque editado con exito.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
	        
	        if (this.chequeSeleccionado.getEstadoCheque() == null) {
	        	this.chequeSeleccionado.setEstadoCheque(estadoChequeAux);
			}
	        
	        this.chequeSeleccionado.setMonto(Double.parseDouble(montoEditar));
			ServiceLocator.getChequeService().crearOEditarCheque(this.chequeSeleccionado);
			this.chequeSeleccionado = null;
			montoEditar = null;
			
			this.estadoChequeAux = null;
			this.nombreEstadoCheque = null;
			this.estadosCheques = ServiceLocator.getChequeService().buscarTodosEstadoCheque();
		 
			this.panelEditarVisibilidad = false;
			this.panelRegistrarVisibilidad = true;
			
			return null;
		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cheque",  "No se ha seleccionado un cheque.");  
	        FacesContext.getCurrentInstance().addMessage(null, message);  
			return null;
		}
	}
	
	public String editarCheque() {
		
		if (this.chequeSeleccionado != null) {

			this.panelEditarVisibilidad = true;
			this.panelRegistrarVisibilidad = false;
			this.panelBuscarVisibilidad = false;
			
			montoEditar = String.valueOf(this.chequeSeleccionado.getMonto());
			
			this.estadoChequeAux = this.chequeSeleccionado.getEstadoCheque();
			this.nombreEstadoCheque = this.chequeSeleccionado.getEstadoCheque().getEstado();
			
			for(int i = 0; i < estadosCheques.size(); i++){
				if (estadoChequeAux.getEstado().equals(estadosCheques.get(i).getEstado())) {
					estadosCheques.remove(i);
				}
			}
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No ha seleccionado ningun elemento.");  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}
	
	public String eliminarCheque() {
		
		if (this.chequeSeleccionado != null) {

			try {
				ServiceLocator.getChequeService().eliminarCheque(this.chequeSeleccionado);
			} catch (Exception e) {

				FacesMessage message2 = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", Mensajes.ELEMENTO_ASIGNADO);  
				RequestContext.getCurrentInstance().showMessageInDialog(message2);
				return null;
			}

			this.chequeSeleccionado = null;

			Double monto = null;
			if (montoBuscar != "" && montoBuscar != null) {
				monto = Double.parseDouble(montoBuscar);
			}
			this.cheques = ServiceLocator.getChequeService().buscarCheque(nombreBuscar, apellidoBuscar, bancoBuscar, sucursalBuscar, cuentaBuscar, fechaDesdeBuscar, fechaHastaBuscar, monto, estadoBuscar);

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.OPERACION_EXITOSA);  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			
			return null;

		} else {
			
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", Mensajes.ELEMENTO_NO_SELECCIONADO);  
	        RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;
		}	

	}

	public String buscarCheque() {
		
		Double monto = null;
		if (montoBuscar != "" && montoBuscar != null) {
			monto = Double.parseDouble(montoBuscar);
		} 
		
		this.cheques = ServiceLocator.getChequeService().buscarCheque(nombreBuscar, apellidoBuscar, bancoBuscar, sucursalBuscar, cuentaBuscar, fechaDesdeBuscar, fechaHastaBuscar, monto, estadoBuscar);

		if (this.cheques != null && !this.cheques.isEmpty()) {

			return null;

		} else {

			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Advertencia", "No se encotraron resultados para la busqueda.");  
			RequestContext.getCurrentInstance().showMessageInDialog(message);
			return null;		
		}
	}
	
	public void visibilizarBuscar() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = false;
	}
	
	public void visibilizarRegistrar() {
		
		panelBuscarVisibilidad = false;
		panelEditarVisibilidad = false;
		panelRegistrarVisibilidad = true;
	}
	
	public void volverBusqueda() {
		
		panelBuscarVisibilidad = true;
		panelEditarVisibilidad = false;

		Double monto = null;
		if (montoBuscar != "" && montoBuscar != null) {
			monto = Double.parseDouble(montoBuscar);
		} 
		
		this.cheques = ServiceLocator.getChequeService().buscarCheque(nombreBuscar, apellidoBuscar, bancoBuscar, sucursalBuscar, cuentaBuscar, fechaDesdeBuscar, fechaHastaBuscar, monto, estadoBuscar);
	}
}
